package edu.qd.learn.newchapter.chapter05;

import com.sun.deploy.util.StringUtils;

import java.io.*;
import java.util.Objects;

/**
 * io
 * stream
 * 字节流 inputstream outputstream【所有文件】
 * 字符流 reader writer【所有文本{字母、数字 }】
 * 池 ： 缓存流{缓冲区}   快一些对吗?
 * 缓存流：buffer reader writer
 *
 * @author 布衣
 */
public class CtrlCV {

    /**
     * 读写txt文件为例
     *
     * @param pathName 文件地址  D:\abc\def\xyz\www\demo.txt
     */
    public static void readTxt(String pathName) {
        assert pathName != null && !pathName.isEmpty();
        try (
                Reader reader = new FileReader(pathName);
        ) {
            while (reader.ready()) {
                int read = reader.read();
                System.out.println((char) read);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void writeTxt(String pathName, String msg) {
        assert pathName != null && !pathName.isEmpty();
        try (
                Writer writer = new FileWriter(pathName);
        ) {

            writer.write(msg);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    public static void readBufferTxt(String pathName) {
        assert pathName != null && !pathName.isEmpty();
        try (
//            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(pathName));
                BufferedReader reader = new BufferedReader(new FileReader(pathName));
        ) {
            while (reader.ready()) {
                String s = reader.readLine();
                System.out.println(s);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void printFileName(String dirName) {
        if (dirName == null || dirName.isEmpty()) {
            throw new RuntimeException("请正确。。。");
        }
        File dir = new File(dirName);
        if (!dir.isDirectory()) {
            throw new RuntimeException("请正确传递文件夹路径");
        }

        File[] fs = dir.listFiles();
        for (File f : fs) {
            if (f.isFile()) {
                System.out.println(f.getName());
            } else {
                printFileName(f.getAbsolutePath());
            }
        }


    }


    /**
     * 检查源文件和目标文件的参数是否有效，如果参数为空，则抛出运行时异常
     *
     * @param src  源文件
     * @param dest 目标文件
     */
    private static void checkArgs(String src, String dest) {
        if (src == null || src.isEmpty()) {
            throw new RuntimeException("请正确传递参数");
        }
        if (dest == null || dest.isEmpty()) {
            throw new RuntimeException("请正确传递粘贴位置");
        }
        File srcFile = new File(src);
        if (!srcFile.exists()) {
            throw new RuntimeException("源文件不存在");
        }

        File destFile = new File(dest);
        if (!destFile.exists()) {
            try {
                destFile.createNewFile();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    /**
     * 将一个文件的内容复制到另一个文件中
     * 此方法首先检查源文件和目标文件的参数是否有效，然后打开源文件进行读取，并将内容写入目标文件
     * 如果在复制过程中发生IO错误，将删除目标文件以避免不完整的文件写入，并抛出运行时异常
     *
     * @param src  源文件路径，不能为空
     * @param dest 目标文件路径，不能为空
     * @throws RuntimeException 如果文件读写过程中发生错误，则抛出运行时异常
     */
    public static void copyToOther(String src, String dest) {
        // 检查源文件和目标文件的参数是否有效
        checkArgs(src, dest);
        try (
                // 创建文件输入流，用于读取源文件
                FileInputStream is = new FileInputStream(src);
                // 创建文件输出流，用于写入目标文件
                FileOutputStream os = new FileOutputStream(dest);
        ) {
            int n = 0;
            // 循环读取源文件内容，直到文件结束
            while ((n = is.read()) != -1) {
                // 将读取的内容写入目标文件
                os.write(n);
            }
        } catch (IOException e) {
            // 如果发生IO错误，删除目标文件以避免不完整的文件写入
            File destFile = new File(dest);
            destFile.delete();
            // 将IO异常包装成运行时异常并重新抛出
            throw new RuntimeException(e);
        }
    }


    public static void main(String[] args) {
        readBufferTxt("D:\\abc\\def\\xyz\\www\\demo.txt");
//        writeTxt("D:\\abc\\def\\xyz\\www\\demo.txt","hello world");
//        readTxt("D:\\abc\\def\\xyz\\www\\demo.txt");
//        printFileName("D:\\javaworkspace");
//        copyToOther("D:\\abc\\def\\xyz\\www\\a.png","D:\\abc\\def\\xyz\\www\\b.png");
    }
}
